﻿using Pay.IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Pay.DTO;
using Pay.TO;
using Pay.Token.Utils;
using System.Threading.Tasks;
using Pay.Core;
using Senparc.Weixin.MP.AdvancedAPIs;
using Senparc.Weixin;

namespace Pay.Token.Controllers {
    /// <summary>
    /// 商城通用
    /// </summary>
    [AppAuthorize("Member")]
    public class CommonTokenMallController : GeneralController {
        public CommonTokenMallController() {
        }

        /// <summary>
        /// 获得微信授权
        /// </summary>
        /// <param name="returnUrl"></param>
        /// <returns></returns>
        [HttpGet, AllowAnonymous]
        public ActionResult GetWXOpenIdAuth(string returnUrl) {
            //2.构造redirect_uri 也就是回调函数  $"" 相当于string.format在C#6.0之后出现的也是占位符    
            //new { returnUrl} 这个的意思就是匿名构造函数，为什么只有一个值，因为returnUrl=returnUrl 一致，所以可以直接写
            /*
             *Url.Action("方法名"，"匿名方法")  需要回调函数，所以需要再写一个CallBack方法,如果不使用过滤器的话，就returnUrl="/" 
             */
            string redirect_uri = $"{t_RequestMethod.token_url}{Url.Action("WXOpenIdAuthCallBack", new { returnUrl = returnUrl })}";
            //3.state 也是下面的方法需要的参数，这个参数是可以自定义的
            string state = "wx" + DateTime.Now.Millisecond;
            Session["state"] = state;//一旦比较完之后需要清空必须清空
            //1.OAuthApi下的GetAuthorizeUrl方法用来获取验证地址,第二个参数是redirect_uri，所以我们就需要构造这个参数
            string redirect = OAuthApi.GetAuthorizeUrl(Pay.Core.WeiXin.TenPayV3Info.AppId, redirect_uri, state, Senparc.Weixin.MP.OAuthScope.snsapi_base);
            return Redirect(redirect);
        }

        /// <summary>
        /// 获得微信授权回调 
        /// </summary>
        /// <param name="code"></param>
        /// <param name="state"></param>
        /// <param name="returnUrl"></param>
        /// <returns></returns>
        [HttpGet, AllowAnonymous]
        public ActionResult WXOpenIdAuthCallBack(string code, string state, string returnUrl) {
            var log = IocHelper.Get<ILogHelper>("info");
            if (Session["state"].ToString() != state) {
                Session["state"] = null;
                return Content("请重新进入");
            }
            Session["state"] = null;
            //如果code返回的是个空值，则需要回到授权界面，重新授权
            if (string.IsNullOrEmpty(code)) {
                return RedirectToAction("index");
            }
            //通过回调函数返回的code来获取令牌  ，如果不懂可单步执行，看url的变化
            var accessToken = OAuthApi.GetAccessToken(Pay.Core.WeiXin.TenPayV3Info.AppId, Pay.Core.WeiXin.TenPayV3Info.AppSecret, code);//这里返回的是一个对象，可以用弱类型var接收
            log.Info("微信授权回调，openid:" + accessToken.openid);
            if (accessToken.errcode != ReturnCode.请求成功) {
                //如果令牌的错误信息不等于请求成功，则需要重新返回授权界面
                return RedirectToAction("GetWXOpenIdAuth");
            }
            Session["oauthAccessToken"] = accessToken;//保存起来过滤器判断
            try {
                returnUrl = System.Web.HttpUtility.UrlDecode(returnUrl);
                if (returnUrl.Contains("?")) {
                    returnUrl += "&wxOpenId=" + accessToken.openid;
                } else {
                    returnUrl += "?wxOpenId=" + accessToken.openid;
                }
                return Redirect(returnUrl);
            }
            catch {
                //如果没有获取到用户的信息，则需要重新进去授权界面
                string redirect_uri = $"{t_RequestMethod.token_url}{Url.Action("WXOpenIdAuthCallBack", new { returnUrl = returnUrl })}";
                string state1 = "wx" + DateTime.Now.Millisecond;
                Session["state"] = state1;//一旦比较完之后需要清空必须清空
                string redirect = OAuthApi.GetAuthorizeUrl(Pay.Core.WeiXin.TenPayV3Info.AppId, redirect_uri, state1, Senparc.Weixin.MP.OAuthScope.snsapi_base); return Redirect(redirect);

            }
        }
    }
}